var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        if (typeof b !== "function" && b !== null)
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
// 接口interface
function drawPoint(x, y) {
    console.log({ x: x, y: y });
}
console.log(18, 80);
// 函数参数  
// 用接口myPot 来限制Ipoint 参数类型
function draw(Ipoint) {
    console.log({ x: Ipoint.x, y: Ipoint.y });
}
draw({ x: 50, y: 90 });
// 面向对象
// es5 的构造函数
function Say(name, color) {
    this.name = name;
    this.color = color;
    this.run = function () { };
}
var xiaowang = new Say("小王", 18);
// ts 的构造函数
var Person = /** @class */ (function () {
    function Person(myname, myage) {
        this.name = myname;
        this.age = myage;
    }
    Person.prototype.eat = function (food) {
        console.log(this.name + food);
    };
    return Person;
}());
var Student = /** @class */ (function (_super) {
    __extends(Student, _super);
    function Student(grade, banji) {
        var _this = _super.call(this, "李哲书", 18) || this;
        _this.grade = grade;
        _this.banji = banji;
        return _this;
    }
    return Student;
}(Person));
var li = new Student("20", "11");
li.eat("吃6个馒头");
var xiaolong = new Person("小龙", "18");
console.log(xiaolong);
xiaolong.eat("车厘子");
// implements 用类 实现接口
// class Car implements CarFace{
//       name:string;
//       color:string;
//       constructor(name,color){
//         this.name=name;
//         this.color=color;
//       }
//       run(abc:string){
//           console.log(this.name)
//       } 
//       jia(L: number) {
//         console.log(L)
//       }
// }
//   let benchi=new Car("奔驰","蓝色");
//   console.log(benchi)
//   benchi.jia(55)
// class类的修饰符 
// public 公共的  谁都可以使用   用来修饰 属性和方法
// private 私有的  只能在类的内部使用    用来修饰 属性和方法
// protected修饰符 受保护的  与 private修饰符的行为很相似，但有一点不同， protected成员在派生类中仍然可以访问。
var Animal = /** @class */ (function () {
    function Animal(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    Animal.prototype.eat = function () {
        console.log("吃");
        this.sleep();
    };
    // protected 受保护的方法
    Animal.prototype.jump = function () {
        console.log("跳");
    };
    // 私有方法  只能在当前类中调用
    Animal.prototype.sleep = function () {
        console.log("睡觉");
    };
    Animal.prototype.run = function () {
        if (this.sex) {
            console.log("跑步");
        }
        else {
            console.log("不跑步");
        }
    };
    // static 静态方法
    Animal.jiao = function () {
        console.log("giao");
    };
    return Animal;
}());
Animal.jiao(); //静态方法的调用 类名.方法()
var tom = new Animal("旺财", 5, true);
console.log(tom.name);
console.log(tom.age);
tom.eat();
tom.run();
// 
var Dog = /** @class */ (function (_super) {
    __extends(Dog, _super);
    function Dog(tizhong, color) {
        var _this = _super.call(this, "汤姆", 3, true) || this;
        _this.tizhong = tizhong;
        _this.color = color;
        // 只读属性
        _this.kkk = "今天星期一";
        _this.color = color;
        _this.tizhong = tizhong;
        return _this;
    }
    Dog.prototype.look = function () {
        console.log("ccc");
        this.jump(); //调用到了父类中的受保护的方法
    };
    return Dog;
}(Animal));
var wang = new Dog(188, "green");
wang.look();
wang.tizhong = 200;
console.log(wang.kkk);
// ts可以完全使用es6的模块化
